/***************************************************************
 * @file           ad7685.c
 * @brief
 * @author         WKJay
 * @Version
 * @Date           2024-05-13
 ***************************************************************/
#include "gd32f3x0.h"
uint16_t ad7685_data;

void ad7685_spi_rcu_config(void) {
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SPI0);
}

void ad7685_spi_gpio_config(void) {
    // SPI0 GPIO config: SCK/PA5, MISO/PA6
    gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_5 | GPIO_PIN_6);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_5 | GPIO_PIN_6);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6);

    // SPI0 GPIO config: CNV/PA4
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
    gpio_bit_reset(GPIOA, GPIO_PIN_4);

    // SPI0 GPIO config: MOSI/PA7 保持高电平
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    gpio_bit_set(GPIOA, GPIO_PIN_7);
}

void ad7685_spi_config(void) {
    spi_parameter_struct spi_init_struct;

    spi_i2s_deinit(SPI0);
    spi_struct_para_init(&spi_init_struct);

    spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode = SPI_MASTER;
    spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
    spi_init_struct.nss = SPI_NSS_SOFT;
    spi_init_struct.prescale = SPI_PSC_4;
    spi_init_struct.endian = SPI_ENDIAN_MSB;

    spi_init(SPI0, &spi_init_struct);
}

void ad7685_spi_init(void) {
    ad7685_spi_rcu_config();
    ad7685_spi_gpio_config();
    ad7685_spi_config();
    spi_enable(SPI0);
}

void ad7685_read_data(void) {
    int i = 0;
    // 启动转换, PA4: CNV
    gpio_bit_reset(GPIOA, GPIO_PIN_4);
    gpio_bit_set(GPIOA, GPIO_PIN_4);
    for (i = 0; i < 70; i++) {
        // 不要开优化，此处约为 4 us
    }
    gpio_bit_reset(GPIOA, GPIO_PIN_4);

    // 数据读取
    spi_i2s_data_transmit(SPI0, 0xFFFF);
    while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
    while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
    ad7685_data = spi_i2s_data_receive(SPI0);

    gpio_bit_set(GPIOA, GPIO_PIN_4);
}

